package simple.string;

/**
 * <a href="https://leetcode.cn/problems/goat-latin/">824. 山羊拉丁文</a>
 * 给你一个由若干单词组成的句子 sentence ，单词间由空格分隔。每个单词仅由大写和小写英文字母组成。
 * 请你将句子转换为 “山羊拉丁文（Goat Latin）”（一种类似于 猪拉丁文 - Pig Latin 的虚构语言）。山羊拉丁文的规则如下：
 *   如果单词以元音开头（'a', 'e', 'i', 'o', 'u'），在单词后添加"ma"。
 *     例如，单词 "apple" 变为 "applema" 。
 *   如果单词以辅音字母开头（即，非元音字母），移除第一个字符并将它放到末尾，之后再添加"ma"。
 *     例如，单词 "goat" 变为 "oatgma" 。
 *   根据单词在句子中的索引，在单词最后添加与索引相同数量的字母'a'，索引从 1 开始。
 *     例如，在第一个单词后添加 "a" ，在第二个单词后添加 "aa" ，以此类推。
 * 返回将 sentence 转换为山羊拉丁文后的句子。
 * 示例 1：
 *   输入：sentence = "I speak Goat Latin"
 *   输出："Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
 * 示例 2：
 *   输入：sentence = "The quick brown fox jumped over the lazy dog"
 *   输出："heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
 * 提示：
 *   1 <= sentence.length <= 150
 *   sentence 由英文字母和空格组成
 *   sentence 不含前导或尾随空格
 *   sentence 中的所有单词由单个空格分隔
 * @author 刘学松
 * @date 2023-06-28 16:17
 */
public class 山羊拉丁文 {
    public String toGoatLatin(String sentence) {
        // 元音字母判断
        boolean[] isVowel = new boolean[123];
        isVowel['a'] = isVowel['e'] = isVowel['i'] = isVowel['o'] = isVowel['u'] = isVowel['A'] = isVowel['E'] = isVowel['I'] = isVowel['O'] = isVowel['U'] = true; 
        StringBuilder sb = new StringBuilder();
        StringBuilder asb = new StringBuilder();
        // 记录单词首字母
        char head = 0;
        for (char c : sentence.toCharArray()) {
            // 遇到空格，则表示当前单词的结束，重置head表示下一个单词的开头
            if (c == ' ') {
                if (!isVowel[head]) {
                    sb.append(head);
                }
                sb.append("ma").append(asb.append("a")).append(c);
                head = 0;
            } else {
                if (head == 0) {
                    head = c;
                    if (isVowel[head]) {
                        sb.append(c);
                    }
                } else {
                    sb.append(c);
                }
            }
        }
        // 最后一个单词的处理
        if (!isVowel[head]) {
            sb.append(head);
        }
        return sb.append("ma").append(asb).append("a").toString();
    }
}
